<?php  if ( ! defined('IN_DiliCMS')) exit('No direct script access allowed');

class Field_behavior {
    
	/**
     * CI引用
     * 
     * @var type 
     */
	private $_ci = NULL;
    
    /**
     * 字段信息
     * 
     * @var array 
     */
	private $_extra_fields  = array();
	
    /**
     * 构造函数
     */
	public function __construct() {
		$this->_ci = &get_instance();
		$this->_ci->settings->load('fieldtypes'); //加载字段类型
		log_message('debug', "DiliCMS Field_behavior Class Initialized");	//写日志?
	}
	
    /**
     * 加载自定义的字段类型类
     * 
     * @param string $type 自定义字段类型名称
     */
	private function _load_extra_field($type) {
		if(!in_array($type,array_keys($this->_extra_fields))) { //如果现有的不存在才加载
			$extra_class = 'extra_field_'.$type; //类名
			if(file_exists(FCPATH.'extra/'.$extra_class.EXT)) { //类文件路径
				include FCPATH.'extra/'.$extra_class.EXT;
				if(class_exists($extra_class)) {
					$this->_extra_fields[$type] = new $extra_class(); //加载
				}
				else {
					$this->_ci->_message('自定义的字段类型类不存在','',false);
				}
			}
			else {
				$this->_ci->_message('自定义的字段类型类文件不存在','',false);
			}
		}
	}
	
    /**
     * 判断是否为自定义字段类型
     * 
     * @param string $type 字段类型名称
     * @return bool 是/否 
     */
	private function _is_extra($type = '') {
		return !in_array($type,array_keys(setting('fieldtypes'))); //是否存在于设置的选项中
	}
	
	/**
     * 生成符合 CI 需求结构的 字段信息数组
     * 
     * @param array $data 字段信息数组
     * @param string $oldname 旧的字段名称
     * @return array 字段信息数组
     */
	public function  on_info($data,$oldname = '') {
		if($this->_is_extra($data['type'])) { //如果此类型属于扩展类型，则加载相应的类
			$this->_load_extra_field($data['type']); //加载
			$field = $this->_extra_fields[$data['type']]->on_info($data); //递归获取信息
		}
		else { //如果是已加载的字段类型
			switch($data['type']) {
                case 'select_from_model' : //select 从模型中选取
                case 'radio_from_model': //radio 从模型中选取
                case 'int' :  //默认的 int 类型
                    $field = array(
                        'type' => 'INT',
                        'constraint' => $data['length'] ? $data['length'] : 10 ,
                        'default' => 0
                    ) ;
                                break;
                case 'float' : //浮点数
                    $field = array(
                        'type' => 'FLOAT',
                         'constraint' => $data['length'] ? $data['length'] : 10,
                         'default' => 0
                    ) ;
                    break;
                case 'input' : //文本
                case 'select': //select 文本
                case 'radio' : //radio 文本
                case 'checkbox': //checkbox 文本
                case 'checkbox_from_model': //checkbox 来自模型 文本
                case 'datetime': //datetime 文本
                case 'colorpicker': //color 颜色 文本
                case 'linked_menu': //链接到某个菜单 文本
                case 'textarea' :  //输小的输入区，文本
                    $field = array(
                        'type' => 'VARCHAR',
                        'constraint' => $data['length'] ? $data['length'] : 100 ,
                        'default' => ''
                    ) ;
                    break;
                case 'wysiwyg' : //大型文本,text 类型，下同
                case 'wysiwyg_basic':
                    $field = array(
                        'type' => 'TEXT',
                        'default' => ''
                    ) ;
                break;
            }
		}
        if($oldname != '') { //如果旧的字段名称不为空，即：要重命名此字段名称
            $field['name'] = $data['name'];
            return array($oldname => $field);
        }
        else {
            return array($data['name'] => $field); //返回生成的字段信息
        }
	}
	
    /**
     * 在表单中的字段显示
     * 
     * @param string $field 字段名称
     * @param string $default 默认值
     * @param string $has_tip 提示信息
     */
	public function on_form( $field, $default = '' , $has_tip = true) {
	//	print_r($default);
		if($this->_is_extra($field['type'])) { //如果未加载类型，则加载 
 			$this->_load_extra_field($field['type']);
 			$this->_extra_fields[$field['type']]->on_form($field, $default, $has_tip);
		}
		else { 
			$default_value_enabled = array('int','float','input','textarea','colorpicker','datetime'); //查看是否有指定默认值,以下字段类型支持
			if(in_array($field['type'],$default_value_enabled) && $default == '' && $field['values']) {
				$default = $field['values'];
			}
			
			$this->_ci->form->display($field, $default, $has_tip); //显示
		}
	}
	
    /**
     * 获取在 list 显示的字段，即 文章(等模型的数据的)列表页
     * 
     * @param string $field
     * @param string $value 
     */
	public function on_list( $field ,  $value) {
		if($this->_is_extra($field['type'])) { //如果没有设置则加载
			$this->_load_extra_field($field['type']);
			$this->_extra_fields[$field['type']]->on_list($field,  $value);
		}
		else {
			switch($field['type']) {
				case 'radio' 	:
				case 'select'	:
                    echo isset($field['values'][$value->$field['name']]) ?  $field['values'][$value->$field['name']] : 'undefined' ; //$field['values'] 是从数据库中读出，$value->field['name'] 为已设定，下同
                    break;
				case 'checkbox' :
                    $tarr = explode(',', $value->field['name']); //此处有修改，原来 explode 在 foreach() 里面
                    foreach($tarr as $t) {
                        echo isset($field['values'][$t]) ?  $field['values'][$t].'<br />' : 'undefined'.'<br />';
                    }
                    break;
				case 'radio_from_model':
				case 'select_from_model':
                    $options = explode('|',$field['values']);
                    $this->_ci->settings->load('category/data_'.$options[0]); //从缓存中获取
                    $setting = &setting('category');
                    echo isset($setting[$options[0]][$value->$field['name']][$options[1]]) ? $setting[$options[0]][$value->$field['name']][$options[1]] : 'undefined' ;
                    break;
				case 'checkbox_from_model':
                    $options = explode('|',$field['values']);
                    $this->_ci->settings->load('category/data_'.$options[0]);
                    $setting = &setting('category');
                    $checkbox_values = explode(',',$value->$field['name']);
                    foreach($checkbox_values as $checkbox) {
                        echo isset($setting[$options[0]][$checkbox][$options[1]]) ? $setting[$options[0]][$checkbox][$options[1]].'<br />' : 'undefined<br />' ;
                    }
                    break;
				case 'linked_menu':
                    $options = explode('|',$field['values']);
                    if(!$this->_ci->platform->cache_exists(FCPATH.'settings/category/data_'.$options[0].EXT)){
                    	$param=$value->$field['name'];		//外键值
                    	$param=str_replace(",","",$param);
                    	$sql="select $options[1],id from  dili_u_m_$options[0] where id=$param ";
                    	$txt=$this->_ci->db->query($sql)->result();
                    	if(!empty($txt[0])){
                    		$temp_out[0]=$txt[0]->$options[1];
                    	}else{
                    		$temp_out[0]="<b style='color:red;'>参数错误</b>";
                    	}	
                    }else{
                   		$this->_ci->settings->load('category/data_'.$options[0]);
	                    $setting = &setting('category');
	                    $temp_out = explode('|',$value->$field['name']);
	                 //   print_r($temp_out);
	                    foreach($temp_out as &$t) {
	                        $t = str_replace(',','',$t);
	                        $temp = explode('-',$t);
	                        foreach($temp as &$tt) {
	                            $tt = (isset($setting[$options[0]][$tt][$options[1]]) ? $setting[$options[0]][$tt][$options[1]] : 'undefined');
	                        }
	                        $t = implode('-',$temp);
	                    }
                    }
                   // print_r($temp_out);
                    echo implode(',',$temp_out);
                    break;
				default :
                    echo $value->$field['name'];	
			}
		}
	}
	
    /**
     * 搜索时的字段处理
     * 在第三方加载的类中有 echo 显然是不合适的
     * 
     * @param string $field 字段名称
     * @param string $default 默认值
     */
	public function on_search($field , $default) {
		if($this->_is_extra($field['type'])) { //如果是未加载
			$this->_load_extra_field($field['type']);
			$this->_extra_fields[$field['type']]->on_search($field, $default);
		}
		else {
			switch($field['type']) {
				case 'select':
				case 'checkbox':
				case 'radio':
				case 'select_from_model':
				case 'radio_from_model':
				case 'checkbox_from_model':
				case 'linked_menu':
				case 'colorpicker':
                    $this->_ci->form->display($field , $default , false);
                    break;
				case 'datetime':
				case 'int':
				case 'float':
                    $field_min = $field_max = $field;
                    $field_min['name'] = $field_min['name'].'_min';
                    $field_max['name'] = $field_max['name'].'_max';
                    $this->_ci->form->display($field_min , $this->_ci->input->get_post($field['name'].'_min') ? $this->_ci->input->get_post($field['name'].'_min') : '' , false);
                    $this->_ci->form->display($field_max , $this->_ci->input->get_post($field['name'].'_max') ? $this->_ci->input->get_post($field['name'].'_max') : '' , false);
                    break;
				default : 
                    echo $this->_ci->form->_input($field ,$default);
			}
		}
	}
	
    /**
     * 搜索时的字段处理
     * 
     * @param string $field 字段信息
     * @param array $condition 条件?
     * @param array $where 条件?
     * @param string $suffix 后缀?
     */
	public function on_do_search( $field , & $condition , & $where ,& $suffix ) {
		if($this->_is_extra($field['type'])) {
			$this->_load_extra_field($field['type']);
			$this->_extra_fields[$field['type']]->on_do_search($field,$condition,$where,$suffix);
		}
		else {
			switch($field['type']) {
				case 'select':
				case 'radio':
				case 'select_from_model':
				case 'radio_from_model':
				case 'colorpicker':
                    $keyword = $this->_ci->input->get_post($field['name']); //此项只为不在 ide 中提示警告，下同
                    if($keyword) {
                        $condition[$field['name'].' ='] = $keyword;
                        $where[$field['name']] = $keyword;
                        $suffix .= '&'.$field['name'].'='.$keyword;
                    }
                    break;
				case 'datetime':
				case 'int':
				case 'float':
                    $keyword_min = $this->_ci->input->get_post($field['name'].'_min'); //此项只为不在 ide 中提示警告
                    if($keyword_min) {
                        $condition[$field['name'].' >='] = $keyword_min;
                        $where[$field['name'].'_min'] = $keyword_min;
                        $suffix .= '&'.$field['name'].'_min='.$keyword_min;
                    }
                    $keyword_max = $this->_ci->input->get_post($field['name'].'_max');
                    if($keyword_max) {
                        $condition[$field['name'].' <='] = $keyword_max;
                        $where[$field['name'].'_max'] = $keyword_max;
                        $suffix .= '&'.$field['name'].'_max='.$keyword_max;
                    }
                    break;
				case 'input':
				case 'textarea':
				case 'wysiwyg':
				case 'wysiwyg_basic':
                    $keyword = $this->_ci->input->get_post($field['name']); //此项只为不在 ide 中提示警告
                    if($keyword) {
                        $condition[$field['name'].' LIKE'] = $keyword;
                        $where[$field['name']] = $keyword;
                        $suffix .= '&'.$field['name'].'='.$keyword;
                    }
                    break;
				case 'checkbox':
				case 'checkbox_from_model':
				case 'linked_menu':
                    $keyword = $this->_ci->input->get_post($field['name']); //此项只为不在 ide 中提示警告
                    if($keyword) {
                        $where[$field['name']] = $keyword;
                        $suffix .= '&'.$field['name'].'='.$keyword;
                        $keyword = is_array($keyword) ? $keyword : explode(( $field['type'] == 'linked_menu' ? '|' : ','),$keyword);
                        $real_condition = array();
                        foreach($keyword as $k) {
                            $real_condition[] = $field['name']." LIKE '%$k%' ";
                        }
                        if($real_condition) {
                            $this->_ci->db->where(implode(' AND ',$real_condition),'',false);
                        }
                    }
                    break;
				default :
                    break;
			}
		}
	}
	
}

